#ifndef HASHTABLE_H
#define HASHTABLE_H

/* 一个单项链表 */
template <class Value>
struct __hashtable_node {
    __hashtable_node * next;
    Value val;
};

template <class Value, class Key, class HashFcn,
          class ExtractKey, class EqualKey,
          class Alloc = alloc>
class hashTable {
public:
    typedef HashFcn hasher;//这个函数用于计算元素的hashCode，根据hashCode 决定元素的安插位置
    typedef EqualKey key_equal;// 这个函数用于表示 两个元素相等的条件
    typedef size_t size_type;

private:
    hasher hash;
    key_equal equals;
    ExtractKey get_key;

    typedef __hashtable_node<Value> node;
    vector<node*, Alloc> buckets;
public:
    size_type bucket_count() const { return buckets.size();}
};


template <class Value, class Key,
          class HashFcn, class ExtrachKey,
          class EqualKey, class Alloc>
struct __hashtable_iterator{
    typedef __hashtable_node<Value> node;
    node * cur;
    hashTable* ht;
};

/**
  这里的 node 是指向一个 buckets vector 中一个bucket的链表节点，这个节点用于知晓 迭代器 查找元素是否走到链表的末尾。
  当走到末尾时，迭代器有能力会切换到下一个 bucket 中，然后在新的bucket 中继续遍历链表。
*/


#endif // HASHTABLE_H
